package com.example.demofdfs.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class JschTest {
	
	
	public static void main(String[] args) {
		
	}
	
	  /** 
     * 利用JSch包实现SFTP下载、上传文件(用户名密码方式登陆) 
     * @param ip 主机IP 
     * @param user 主机登陆用户名 
     * @param psw  主机登陆密码 
     * @param port 主机ssh2登陆端口，如果取默认值(默认值22)，传-1 
     *  
     */  
    public static void sshSftp(String ip, String user, String psw   
            ,int port) throws Exception{  
        System.out.println("开始用户名密码方式登陆");  
        Session session = null;  

        JSch jsch = new JSch();  

        if(port <=0){  
            //连接服务器，采用默认端口  
            session = jsch.getSession(user, ip);  
        }else{  
            //采用指定的端口连接服务器  
            session = jsch.getSession(user, ip ,port);  
        }  

        //如果服务器连接不上，则抛出异常  
        if (session == null) {  
            throw new Exception("session is null");  
        }  

        //设置登陆主机的密码  
        session.setPassword(psw);//设置密码     
        //设置第一次登陆的时候提示，可选值：(ask | yes | no)  
        session.setConfig("StrictHostKeyChecking", "no");  
        //设置登陆超时时间     
        session.connect(30000);  

        sftp_put(session, "aa.log");  
        System.out.println("sftp成功");  
    }  
    
    private static void sftp_put(Session session, String uploadFileName) throws Exception {  
        Channel channel = null;  
        try {  
            //创建sftp通信通道  
            channel = (Channel) session.openChannel("sftp");  
            channel.connect(1000);  
            ChannelSftp sftp = (ChannelSftp) channel;  


            //进入服务器指定的文件夹  
            sftp.cd("/root");  

            //列出服务器指定的文件列表  
            Vector v = sftp.ls("/");  
            for(int i=0;i<v.size();i++){  
                System.out.println(v.get(i));  
            }  

            //以下代码实现从本地上传一个文件到服务器，如果要实现下载，对换以下流就可以了  
            OutputStream outstream = sftp.put(uploadFileName);  
            InputStream instream = new FileInputStream(new File("C:\\aa.txt"));  

            byte b[] = new byte[1024];  
            int n;  
            while ((n = instream.read(b)) != -1) {  
                outstream.write(b, 0, n);  
            }  

            outstream.flush();  
            outstream.close();  
            instream.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            session.disconnect();  
            channel.disconnect();  
        }  
    }  
    
    /* 
     * 从SFTP服务器下载文件 
     *  
     * @param ftpHost SFTP IP地址 
     *  
     * @param ftpUserName SFTP 用户名 
     *  
     * @param ftpPassword SFTP用户名密码 
     *  
     * @param ftpPort SFTP端口 
     *  
     * @param ftpPath SFTP服务器中文件所在路径 格式： ftptest/aa 
     *  
     * @param localPath 下载到本地的位置 格式：H:/download 
     *  
     * @param fileName 文件名称 
     */  
    public static void downloadSftpFile(String ftpHost, String ftpUserName,  
            String ftpPassword, int ftpPort, String ftpPath, String localPath,  
            String fileName) throws JSchException {  
        Session session = null;  
        Channel channel = null;  

        JSch jsch = new JSch();  
        session = jsch.getSession(ftpUserName, ftpHost, ftpPort);  
        session.setPassword(ftpPassword);  
        session.setTimeout(100000);  
        Properties config = new Properties();  
        config.put("StrictHostKeyChecking", "no");  
        session.setConfig(config);  
        session.connect();  

        channel = session.openChannel("sftp");  
        channel.connect();  
        ChannelSftp chSftp = (ChannelSftp) channel;  

        String ftpFilePath = ftpPath + "/" + fileName;  
        String localFilePath = localPath + File.separatorChar + fileName;  

        try {  
            chSftp.get(ftpFilePath, localFilePath);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            chSftp.quit();  
            channel.disconnect();  
            session.disconnect();  
        }  

    }  
}
